package com.jiuyue.demo.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.FindAndModifyOptions;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.util.ReflectionUtils;

/**
 * mongodb 存储数据的_id数据存储为long 类型
 * @author jiu'yue
 *
 */

public class MogoDbSaveEventListener extends AbstractMongoEventListener<Object>  {
	
	
	    @Autowired
	    private MongoTemplate mongo;

	    @Override
	    public void onBeforeConvert(BeforeConvertEvent<Object> event) {
	        Object source = event.getSource();
	        if (source != null) {
	            ReflectionUtils.doWithFields(source.getClass(), new ReflectionUtils.FieldCallback() {
	                @Override
	                public void doWith(java.lang.reflect.Field field) throws IllegalArgumentException, IllegalAccessException {
	                    ReflectionUtils.makeAccessible(field);
	                    // 如果字段添加了我们自定义的AutoIncKey注解
	                    if (field.isAnnotationPresent(AutoIncKey.class)) {
	                        // 设置自增ID
	                        field.set(source, getNextId(source.getClass().getSimpleName()));
	                    }
	                }
	            });
	        }
	    }

	    /**
	     * 获取下一个自增ID
	     *
	     * @param collName
	     *            集合（这里用类名，就唯一性来说最好还是存放长类名）名称
	     * @return 序列值
	     */
	    private Long getNextId(String collName) {
	        Query query = new Query(Criteria.where("collName").is(collName));
	        Update update = new Update();
	        update.inc("seqId", 1);
	        FindAndModifyOptions options = new FindAndModifyOptions();
	        options.upsert(true);
	        options.returnNew(true);
	        SeqInfo seq = mongo.findAndModify(query, update, options, SeqInfo.class);
	        return seq.getSeqId();
	    }

}
